﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Net.Sockets;
using System.IO;
using SmartMarketAgregar.localhost;
using System.Net;

namespace SmartMarketAgregar
{
    public partial class Form1 : Form
    {
      
        private Socket socket;
        private Thread thread;
        bool ligar = false ;
        Service1 servico = new Service1();
        private NetworkStream networkStream;
        private BinaryWriter binaryWriter;
        private BinaryReader binaryReader;
        int codigo = 0;
        TcpListener tcpListener;
        List<Produto> grid = new List<Produto>();
        List<Produto> lista = new List<Produto>();
        Produto produto = new Produto();
       

        public Form1()
        {
       
            InitializeComponent();
            Ligar();
            if (thread.IsAlive)
            {

                MessageBox.Show("aguardando conexão... \n não adicione nenhum produto até o carrinho ser agregado", "Carrinho diz");
                
            }
           
               
        }

        public static string retornoTexto(string entrada)
        {
            return entrada.Split(new char[] { '\n' })[0].Split(new char[] { ':' })[2];
        }


      
        public void Ligar(){
            ligar = false;
            thread = new Thread(new ThreadStart(RunServer));
            thread.Start();
          if (thread.IsAlive) { ligar = true; }
          
        
        }

        private void AddToDataGrid(string mensagem)
        {
            codigo = Convert.ToInt32(mensagem);
            Invoke(new MethodInvoker(
                           delegate
                           {
                               try
                               {
                                   produto.Codigo = codigo;
                                   lista = servico.addProduto(produto).ToList();
                                   // MessageBox.Show(lista.Count.ToString());
                                   foreach (Produto p in lista)
                                   {
                                       grid.Add(p);
                                       //     MessageBox.Show(grid.IndexOf(p).ToString());     
                                   }
                                   gridProduto.DataSource = null;
                                   gridProduto.DataSource = grid;
                                   //  int codigo2 = Convert.ToInt32(textBox1.Text);

                               }
                               catch (Exception ex)
                               {

                                   MessageBox.Show(retornoTexto(ex.Message));
                               }
                           }
                           ));
        }

        public bool Conectar()
        {
            bool retorno = false;
            try
            {
                IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2001);
                tcpListener = new TcpListener(ipEndPoint);
                tcpListener.Start();
                retorno = true;

            }

            
            catch (Exception ex)
            {
                
                MessageBox.Show(ex.Message+"deu pau");
            } return retorno;
        }
        public void desconectar() {

            try
            {
                if (binaryReader != null)
                {
                    binaryReader.Close();
                }
                if (binaryWriter != null)
                {
                    binaryWriter.Close();
                }
                if (networkStream != null)
                {
                    networkStream.Close();
                }
                if (socket != null)
                {
                    socket.Close();
                }
                if (thread.IsAlive)
                {
                    thread.Interrupt();
                }
            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.Message);
            }
        
        
        }

        private void RunServer(){
        try{
            Conectar();
        socket = tcpListener.AcceptSocket();
                networkStream = new NetworkStream(socket);
                binaryWriter = new BinaryWriter(networkStream);
                binaryReader = new BinaryReader(networkStream);
                MessageBox.Show("carrinho agregado com sucesso","Carrinho diz");
                string messageReceived = "";
                do
                {
                    messageReceived = binaryReader.ReadString();
                    AddToDataGrid(messageReceived);    
                  
            }    while (socket.Connected);}
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                
                desconectar();
                ligar = false;
                
                MessageBox.Show("Carrinho Desconectado", "Carrinho diz");
                
            }      
        }



        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                if (textBox1.Text == "")
                {
                    MessageBox.Show("Digite o código do produto");
                    return;
                }
                Produto produto = new Produto();
                produto.Codigo = Convert.ToInt32(textBox1.Text);
                Service1 servico = new Service1();
                List<Produto> lista = servico.addProduto(produto).ToList();
                // grid = new List<Produto>();
                // grid.Clear();

                //grid = null;

                foreach (Produto p in lista)
                {
                    //  grid = new List<Produto>();
                    grid.Add(p);
                    //  MessageBox.Show(p.Nome);
                }


                //  int codigo2 = Convert.ToInt32(textBox1.Text);
                gridProduto.DataSource = null;
                gridProduto.DataSource = grid;

            }
            catch (Exception ex)
            {

                MessageBox.Show(retornoTexto(ex.Message));
            }
            if(ligar == true){
            binaryWriter.Write(textBox1.Text);
            }
            
            
            textBox1.Clear();

        
        }

        private void button2_Click(object sender, EventArgs e)
        {
           

        }

        private void button3_Click(object sender, EventArgs e)
        {
            //desconectar();
            //ligar = false;
            Environment.Exit(0);
        }

        private void label2_Click(object sender, EventArgs e)
        {
            
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}
    

